package com.lifp.thread;

import java.util.concurrent.*;

/**
 * @Description 线程池实例
 *
 *   通过模拟银行窗口业务办理过程，来对比学习线程池
 *      假设当前银行，共有5个业务窗口（最大线程），其中3个主要窗口（核心线程），2个备用窗口
 *      此外，有可容纳3个人的等候区（有界队列）
 *
 * @Author lifp
 * @Date 2023/2/2
 * @Version 1.0
 */
public class ThreadPoolTest {

    public static void main(String[] args) {
        //1、根据场景，常见符合场景的线程池
        ExecutorService executorService = new ThreadPoolExecutor(
                3,//核心线程数
                5,//最大线程数
                1L, //存活时间
                TimeUnit.SECONDS, //存活时间单位
                new ArrayBlockingQueue<>(3),//长度为3的有界队列
                Executors.defaultThreadFactory(),//默认工厂
                new ThreadPoolExecutor.AbortPolicy());//直接抛异常 拒绝策略

        //模拟当前办理业务的人数，通过调解业务人数，测试线程池执行情况
        int customerNumber = 2;

        //2、模拟业务办理过程
        for (int i = 0; i < customerNumber; i++) {
            //通过execute()方法，使用Lambda 表达式，直接写业务执行过程
            executorService.execute(()->{
                System.out.println(Thread.currentThread().getName() + "=====> 办理业务");
            });
        }

        //3、执行完后，关闭线程池
        executorService.shutdown();

    }

}
